const { Controller } = require('egg');

class UserController extends Controller {
    /**
     * 注册接口
     */
    async register() {
        const { ctx } = this;
        // 解构参数
        let { username, nickname, email, password } = ctx.request.body;
        // 非空校验
        if (!username || !nickname || !email || !password) {
            ctx.body = {
                code: 400,
                message: '参数不全',
            };
            return;
        }
        // 校验邮箱 lstyr13@.com
        if (!/\w{1,}@[0-9a-z]{1,}\.com/.test(email)) {
            ctx.body = {
                code: 400,
                message: '邮箱格式不正确',
            };
            return;
        }
        // 校验用户唯一性
        let user = await ctx.service.user.getUserByUsername(username);
        // console.log(user);
        // 用户如果存在，就不允许再创建
        if (user) {
            ctx.body = {
                code: 403,
                message: '用户名已存在，不允许重复创建',
            };
            return;
        }
        // 将用户信息保存到数据库
        let res = await ctx.service.user.create({
            username,
            nickname,
            email,
            password: this.ctx.helper.passwordEncoder(password),
        });
        // 判断是否插入成功
        // console.log(res);
        if (res.affectedRows !== 1) {
            ctx.body = {
                code: 500,
                message: '注册失败',
            };
            return;
        }
        // 走到这里，说明插入成功了
        ctx.body = {
            code: 201,
            data: {
                uid: res.insertId,
            },
            message: '注册成功',
        };
    }

    /**
     * 登录接口
     */
    async login() {
        const { ctx } = this;
        // 解构参数
        let { username, password } = ctx.request.body;
        // 非空校验
        if (!username || !password) {
            ctx.body = {
                code: 400,
                message: '用户或密码不能为空',
            };
            return;
        }
        // 根据用户名，查询数据库，看看是否存在该用户
        let user = await ctx.service.user.getUserByUsername(username);
        // console.log(user);
        if (!user) {
            ctx.body = {
                code: 404,
                message: '用户不存在',
            };
            return;
        }
        // 走到这里，说明用户存在，我们校验密码是否正确
        if (ctx.helper.passwordEncoder(password) !== user.password) {
            ctx.body = {
                code: 400,
                message: '用户名和密码不匹配',
            };
            return;
        }
        // 走到这里，是不是用户存在，并且密码也匹配，我们就可以给他登录了
        // 签发 token
        const token = ctx.helper.genToken({ ...user });
        // 返回响应给前端
        ctx.body = {
            code: 200,
            data: {
                token,
            },
            message: '登录成功',
        };
    }

    /**
     * 修改用户信息
     */
    async update() {
        const { ctx } = this;
        // 解构参数
        const {
            nickname,
            mark,
            sex,
            birthday,
            address,
        } = this.ctx.request.body;
        // 组装一个需要修改的用户信息对象
        let user = {
            id: ctx.user.id,
        };
        // 修改姓名
        if (nickname) {
            user.nickname = nickname;
        }
        // 修改个性签名
        if (mark) {
            user.mark = mark;
        }
        // 修改性别
        if (sex) {
            user.sex = sex;
        }
        // 修改生日
        if (birthday) {
            user.birthday = birthday;
        }
        // 修改地址
        if (address) {
            user.address = address;
        }
        // 调用 service 完成修改
        let res = await this.service.user.update(user);
        // 判断是否修改成功
        if (res.affectedRows !== 1) {
            ctx.body = {
                code: 500,
                message: '修改失败',
            };
            return;
        }
        // 走到这，说明修改成功
        ctx.body = {
            code: 204,
            message: '修改成功',
        };
    }
}

module.exports = UserController;
